const verify = (() => {
  function GVerify(options) {
    this.options = {
      id: "", //容器ID
      canvasId: "verifyCanvas",
      width: "97",
      height: "40",
      type: "blend", //验证码类型(字母、数字、混合)
      code: "",
      numLine: 0,//干扰线数量
      num: 5 //验证码位数(默认5位数)
    }

    if(Object.prototype.toString.call(options) == "[object Object]"){
      for(let i in options) {
        this.options[i] = options[i];
      }
    }else{
      this.options.id = options;
    }

    this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
    this.options.letterArr = getAllLetter();

    this._init();
    this.refresh();
  }

  let ctx = null

  GVerify.prototype = {

    version: '1.0.0',

    _init: function() {
      let con = document.getElementById(this.options.id);
      let canvas = document.createElement("canvas");
      this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100";
      this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "40";
      canvas.id = this.options.canvasId;
      canvas.width = this.options.width;
      canvas.height = this.options.height;
      canvas.style.cursor = "pointer";
      canvas.innerHTML = "您的浏览器版本不支持Cavans";
      con.appendChild(canvas);
      let parent = this;
      canvas.onclick = function(){
        parent.refresh();
      }
    },


    refresh: function() {
      this.options.code = "";
      let canvas = document.getElementById(this.options.canvasId);
      if(canvas.getContext) {
        ctx = canvas.getContext('2d');
      }else{
        return;
      }

      ctx.textBaseline = "middle";//设置或返回在绘制文本时的当前文本基线

      ctx.fillStyle = randomColor(180, 240);
      ctx.fillRect(0, 0, this.options.width, this.options.height);

      let txtArr = []
      if(this.options.type == "blend") {
        txtArr = this.options.numArr.concat(this.options.letterArr);
      } else if(this.options.type == "number") {
        txtArr = this.options.numArr;
      } else {
        txtArr = this.options.letterArr;
      }

      for(let i = 1; i <= this.options.num; i++) {
        let txt = txtArr[randomNum(0, txtArr.length)];
        this.options.code += txt;
        ctx.font = randomNum(24, 40) + 'px SimHei';
        ctx.fillStyle = randomColor(50, 160);
        ctx.shadowOffsetX = randomNum(-3, 3);
        ctx.shadowOffsetY = randomNum(-3, 3);
        ctx.shadowBlur = randomNum(-3, 3);
        ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
        let x = this.options.width / (this.options.num + 2) * i;//根据位数均分画布
        let y = this.options.height / 2;
        let deg = randomNum(-30, 30);
        /*设置旋转角度和坐标位置,以完全显示*/
        ctx.translate(x, y);//translate() 方法重新映射画布上的 (0,0) 位置
        ctx.rotate(deg * Math.PI / 180);
        ctx.fillText(txt, 0, 0);
        /*恢复旋转角度和坐标位置,以方便下次绘画*/
        ctx.rotate(-deg * Math.PI / 180);
        ctx.translate(-x, -y);
      }

      /**绘制干扰线**/
      for(let i = 0; i < this.options.numLine; i++) {
        ctx.strokeStyle = randomColor(40, 180);
        ctx.beginPath();
        ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
        ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
        ctx.stroke();
      }
      /**绘制干扰点(干扰点数量:this.options.width/this.options.num)**/
      for(let i = 0; i < this.options.width/this.options.num; i++) {
        ctx.fillStyle = randomColor(0, 255);
        ctx.beginPath();
        ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
        ctx.fill();
      }
    },

    /*验证是否正确*/
    validate: function(code){
      let getCode = code.toLowerCase();
      let v_code = this.options.code.toLowerCase();
      if(getCode == v_code){
        return true;
      }else{
        // this.refresh();
        return false;
      }
    }
  }

  function getAllLetter() {
    let letterStr = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
    return letterStr.split(",");
  }

  function randomNum(min, max) {
    return Math.floor(Math.random() * (max - min) + min);
  }

  function randomColor(min, max) {
    let r = randomNum(min, max);
    let g = randomNum(min, max);
    let b = randomNum(min, max);
    return "rgb(" + r + "," + g + "," + b + ")";
  }

  return GVerify
})()

export default verify
